﻿using H.QuickDoes;
using System;

namespace H.QuickDo.QuickDoes
{
    /// <summary>
    /// 用于存储Action信息的结构,不对外开放
    /// </summary>
    /// <typeparam name="C"></typeparam>
    public class QDAction<C> where C : IQDContext
    {
        /// <summary>
        /// 被执行的内容,
        /// 
        /// 返回值如果为true,则表示Action已经成功执行,程序将会停止,并从DoAction处返回
        /// 返回值如果为false,如果retry还有值,则会继续进行尝试,直到尝试此处用完再跳转到OnFailure
        /// 如果返回值为Int32,则表示跳转到指定的Action,
        /// 如果返回值为Int32,则表示可以随机跳转到其中某个Action上
        /// </summary>
        public readonly Func<IQuickDo<C>, dynamic> Action;

        /// <summary>
        /// 执行失败后的重试次数
        /// </summary>
        public readonly int Retry;

        /// <summary>
        /// 当执行失败时进行执行等待的时间
        /// </summary>
        public readonly Func<int, int> RetryDelay;

        /// <summary>
        /// 当Action重试后仍然执行失败时
        /// </summary>
        public readonly int? RollbackID;

        /// <summary>
        /// 初始化一个操作
        /// </summary>
        /// <param name="action">执行的内容</param>
        /// <param name="retry">当action返回false时的重试次数</param>
        /// <param name="rollbackID">如果执行<paramref name="retry"/>次失败之后,应该回退的状态</param>
        /// <param name="retryDelay">用于计算重试之前应该等待的时间</param>
        public QDAction(Func<IQuickDo<C>, dynamic> action, int retry, int? rollbackID, Func<int, int> retryDelay)
        {
            Action = action;
            Retry = retry;
            RetryDelay = retryDelay;
            RollbackID = rollbackID;
        }
    }
}
